const jwt = require('jsonwebtoken');
const User = require('../models/User');
require('dotenv').config();

/**
 * 用户认证中间件
 * 验证JWT令牌并将用户信息附加到请求对象
 */
exports.authenticate = async (req, res, next) => {
  try {
    // 从请求头获取令牌
    const authHeader = req.headers.authorization;
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({ success: false, message: '未提供认证令牌' });
    }

    const token = authHeader.split(' ')[1];

    // 验证令牌
    const decoded = jwt.verify(token, process.env.JWT_SECRET);

    // 查找用户
    const user = await User.findByPk(decoded.id, { attributes: { exclude: ['password'] } });
    if (!user) {
      return res.status(401).json({ success: false, message: '用户不存在' });
    }

    // 检查用户状态
    if (user.status !== 'active') {
      return res.status(403).json({ success: false, message: '账号已被禁用，请联系管理员' });
    }

    // 将用户信息附加到请求对象
    req.user = user;
    next();
  } catch (error) {
    if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({ success: false, message: '无效的令牌' });
    }
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({ success: false, message: '令牌已过期' });
    }
    res.status(500).json({ success: false, message: '认证失败', error: error.message });
  }
};

/**
 * 角色授权中间件
 * 验证用户是否具有指定角色
 * @param {string[]} roles - 允许访问的角色列表
 */
exports.authorize = (...roles) => {
  return (req, res, next) => {
    if (!req.user) {
      return res.status(401).json({ success: false, message: '请先进行认证' });
    }

    if (!roles.includes(req.user.role)) {
      return res.status(403).json({ success: false, message: '没有访问权限' });
    }

    next();
  };
};

/**
 * 企业用户授权中间件
 * 验证用户是否为企业用户且已完善企业信息
 */
exports.authorizeCompany = async (req, res, next) => {
  try {
    if (req.user.role !== 'company') {
      return res.status(403).json({ success: false, message: '仅企业用户可访问' });
    }

    // 检查企业信息是否完善
    const company = await Company.findOne({ where: { userId: req.user.id } });
    if (!company || company.status !== 'approved') {
      return res.status(403).json({ success: false, message: '企业信息未审核或未完善' });
    }

    req.company = company;
    next();
  } catch (error) {
    res.status(500).json({ success: false, message: '企业授权失败', error: error.message });
  }
};